<!doctype html>
<html lang="zh">
<head>
  <meta charset="utf-8">
  <title>KISSY - 全终端适配的 JS 类库</title>
  <meta name="viewport" content="width=device-width">
  <link href="http://fonts.googleapis.com/css?family=Droid+Sans|Lekton|Ubuntu+Mono:400,700" rel="stylesheet">
	<link rel="stylesheet" href="templates/assets/bootstrap.css">
	<link href="templates/assets/normalize.css" rel="stylesheet">
	<link href="templates/assets/kissy.css" rel="stylesheet">
	<link href="templates/assets/prettify.css" rel="stylesheet">
	<link href="templates/assets/forkit.css" rel="stylesheet">
	<script src="templates/assets/jquery.min.js"></script>
	<script src="templates/assets/script.js" type="text/javascript"></script>
	<script src="http://g.tbcdn.cn/trip/kissy/1.4.0/seed-min.js"></script>
	<script src="api/assets/highlight.pack.js"></script>
	<link href="api/assets/tomorrow-night-bright.css" rel=stylesheet />
	<link rel="shortcut icon" href="http://a.tbcdn.cn/s/kissy/favicon.ico">
</head>

<body class="">
    <nav id="sidebar">
    <header>
		<a href="index.html">
			<!--img src="http://gtms04.alicdn.com/tps/i4/T1ceiPFbpcXXcljp_h-200-89.png"-->
			<!--img src="templates/assets/img/logo_6.png"-->
			<!--img src="http://gtms04.alicdn.com/tps/i4/T14oa2FcNcXXaOySEh-180-104.png" alt="" /-->
			<!--img src="http://gtms01.alicdn.com/tps/i1/T1Amq1FaXgXXbXVSUh-180-127.png" alt="" /-->
			<img src="http://gtms02.alicdn.com/tps/i2/T1N0jTXXXjXXay7Rri-175-78.png" alt="" />
		</a>
	</header>
    <ul>
      <li class="nav-divider"><a href="index.html"><img src="templates/assets/img/icon-home.png">首页</a></li>
      <li class="nav-divider"><a href="why-kissy.html"><img src="templates/assets/img/icon-why.png">Why KISSY?</a></li>
      <li><a href="get-started.html"><img src="templates/assets/img/icon-getting-started.png">KISSY 1.4.x 教程大纲</a></li>
      <li class="nav-sub"><a href="module-map.html">核心模块列表</a></li>
      <li class="nav-sub"><a href="kmd.html">KISSY 模块规范 (KMD)</a></li>
      <li class="nav-sub"><a href="gbs.html">浏览器兼容基准(GBS)</a></li>
      <li class="nav-sub"><a href="http://cyj.me/jquery-kissy-rosetta/">jQuery KISSY 对比手册</a></li>
      <li class="nav-sub"><a href="http://gallery.kissyui.com/guide">KISSY 组件开发规范</a></li>
      <li class="nav-sub nav-divider"><a href="history.html">历史版本</a></li>
      <li><a href="">API Doc</a></li>
      <li><a href="http://demo.kissyui.com">Demos</a></li>
      <li class="nav-divider"><a href="http://gallery.kissyui.com">KISSY Gallery</a></li>
      <li><a href="tools.html">KISSY 项目构建工具</a></li>
      <li class="nav-sub"><a href="kmc.html">KS Module Compiler</a></li>
      <li class="nav-sub"><a href="http://abc.f2e.taobao.net">ABC</a></li>
      <li class="nav-sub nav-divider"><a href="clam.html">Clam</a></li>
      <li><a href="third-party-lib.html">第三方代码库</a></li>
      <li class="nav-sub"><a href="https://github.com/lorrylockie/tpap/wiki">面向第三方安全的 KISSY</a></li>
      <li class="nav-sub"><a href="http://www.builive.com/demo/index.php">BUI</a></li>
      <li class="nav-sub nav-divider"><a href="http://work.tmall.net/muidoc/build/">MUI</a></li>
      <li><a href="https://github.com/kissyteam/kissy/blob/master/CONTRIBUTING.md">为 KISSY Core 贡献代码</a></li>
      <li class="nav-sub"><a href="http://google-styleguide.googlecode.com/svn/trunk/htmlcssguide.xml">HTML/CSS编码规范</a></li>
      <li class="nav-sub nav-divider"><a href="http://docs.kissyui.com/source/tutorials/style-guide/google/javascriptguide.xml">JavaScript 编码规范</a></li>
	  <li><a href="upgrade.html"><img src="templates/assets/img/icon-documentation.png">1.3.x->1.4.0 升级指南</a></li>
	  <li><a href="faq.html"><img src="templates/assets/img/icon-faqs.png">FAQ</a></li>
      <li><a href="https://github.com/kissyteam/kissy"><img src="templates/assets/img/icon-github.png">GitHub</a></li>
	  <li><a href="core-team.html"><img src="templates/assets/img/icon-google-plus.png">KISSY 核心小组</a></li>
    </ul>
  </nav>

  <div id="content">
    <article>
      

	<p><style>
h3 {
    color:blue;
}
</style></p>
<h1>Promise</h1>
<p>“Promises” （有时也称之为deferred）代表着在javascript程序里一种巧妙的编程范式，它代表了一种可能会长时间运行而且不一定必须完整的操作的结果。这种模式不会阻塞和等待长时间的操作完成，而是返回一个代表了承诺的（promised）结果的对象。因此它的核心就是一个promise，代表一个任务结果，这个任务有可能完成有可能没完成。Promise模式唯一需要的一个接口是调用then方法，它可以用来注册当promise完成或者失败时调用的回调函数阅读，详情请<a href="http://wiki.commonjs.org/wiki/Promises/A">CommonJS Promises/A proposal</a> 。</p>
<h2>Promise 作了什么事情</h2>
<p>Promise 适用于有异步逻辑的场景</p>
<h3>代码第一形态</h3>
<p>实现一个单体，可以传入回调参数，在某个事件发生时触发这个回调，通常我们这样做：</p>
<pre><code>var A = {
    a:1,
    b:2,
    complete:function(){
        // 某个时机触发这个回调
    },
    error:function(){
        // 运行出错时的回调
    }
};

A.init();</code></pre>
<p>这很容易理解，但这段代码忽略了两个信息</p>
<ol>
<li>complete 回调有可能不是在初始化的时候绑定，我们允许在任意位置指定他的回调</li>
<li>如果指定多个回调时，这些回调之间的先后顺序如何控制</li>
</ol>
<h3>代码第二形态</h3>
<p>这个单体暴露事件，由开发者去绑定事件，事件可以任意绑定</p>
<pre><code>// 让 A 可暴露自定义事件
var AFactory = new Function;
augment(AFactory,CustomEvent);
var A = new AFactory();

// 给 A 绑定自定义事件回调
A.on(&#39;complete&#39;,function(){
    // 某个时机触发这个回调
});

A.on(&#39;error&#39;,function(){
    // 运行出错时的回调
});

A.run();</code></pre>
<p>这也很容易理解，这是编程模式中最常见的桥接模式，用来完成核心代码和功能代码之间的耦合和桥接。核心代码和功能代码之间就可以分别来维护了。但当 A 的功能很具体而且很内聚时，可以将这种模式简化为回调：</p>
<pre><code>A.complete(function(){
    // 某个时机触发这个回调
}).error(function(){
    // 运行出错时的回调
});

A.run();</code></pre>
<p>这是一种最常见的简写</p>
<h3>代码第三形态</h3>
<p>异步操作过程可能耗时很久，但通过写状态可以处理外接逻辑的触发时机先后顺序。这样，回调逻辑从“当xx时触发yy回调”，变为“当xx状态改变为yy时，触发zz回调”。即回调在等待状态改变，这种很语义话的表达方式被抽象出来，即形成了Promise的雏形：</p>
<pre><code>A.run().then(function(){
    // 回调1    
}).then(function(){
    // 回调2    
});</code></pre>
<p>独立出Promise对象：</p>
<pre><code>var A = {};/* A 的定义 */
var p1 = new Promise(A);
p1.when(/*条件*/).then(/*行为*/);</code></pre>
<h2>KISSY Promise 的用法</h2>
<p>可以直接通过KISSY.Promise调用：</p>
<pre><code>var d = new KISSY.Promise.Defer();
d.do_somethine();// d 执行相关的方法</code></pre>
<p>也可以通过沙箱来调用</p>
<pre><code>KISSY.use(&#39;promise&#39;,function(S,Promise){
    var d = new Promise.Defer(); // 使用 Promise
});</code></pre>
<p>首先看这个<a href="http://docs.kissyui.com/docs/html/demo/component/promise/index.html">Demo</a>。</p>
<h2>APIs</h2>
<p>注意，Promise()不允许在外部被初始化。通过实例化<code>KISSY.Promise.Defer()</code>来使用Promise的功能。Promise 实例方法有：</p>
<h3>then()  <code>&lt;Promise 实例方法&gt;</code></h3>
<p><code>then ( fulfilled [, rejected] ) =&gt; void</code></p>
<p>监听当前实例的成功和失败并返回新的 promise 实例</p>
<h4>parameter</h4>
<ul>
<li>fulfilled (Function) – 该 promise 成功时的回调，参数为 defer resolve 时的 value.</li>
<li>rejected (Function) – 该 promise 失败时的回调，参数为 defer reject 时的 reason.</li>
</ul>
<h4>return</h4>
<p>一个新的 promise（Promise类型）. 当前 promise 成功时新的 promise 也成功. 当前 promise 失败时新的 promise 也失败.</p>
<h4>example</h4>
<p>参照首<a href="http://docs.kissyui.com/docs/html/demo/component/promise/index.html">Demo</a>。 这里为链式调用写法。</p>
<pre><code>KISSY.use(&#39;node&#39;,function(S,Node){
    K.all(&quot;button&quot;).on(&quot;click&quot;, function () {
        // 生成一个Promise实例d
        var d = new S.Promise.Defer();
        var promise = d.promise;
        promise.then(function (v) {
            return v + 1;
        }).then(function (v) {
            alert(v); // =&gt; 2
        });
        d.resolve(1); // 该位置也可以放在 then 前面
    });
});</code></pre>
<h3>fail()  <code>&lt;Promise 实例方法&gt;</code></h3>
<p><code>fail ( rejected ) =&gt; void</code></p>
<p>监听当前实例的失败并返回新的 promise 实例.相当于调用 <code>this.then(null,rejected)</code>;</p>
<h4>parameter</h4>
<p>rejected (Function) – 该 promise 失败时的回调，参数为 defer reject 时的 reason.</p>
<h4>return</h4>
<p>一个新的 promise(（Promise类型）. 当前 promise 成功时新的 promise 也成功. 当前 promise 失败时新的 promise 也失败.</p>
<h3>fin()  <code>&lt;Promise 实例方法&gt;</code></h3>
<p><code>fin ( callback ) =&gt; void</code></p>
<p>监听当前实例的成功和失败并返回新的 promise 实例</p>
<h4>parameter</h4>
<p>callback (Function) – 该 promise 成功或失败时的回调， 成功时参数为 defer resolve 时的 value 和 true. 失败时参数为 defer reject 时的 reason 和 false.</p>
<h4>return</h4>
<p>一个新的 promise. 当前 promise 成功时新的 promise 也成功. 当前 promise 失败时新的 promise 也失败.</p>
<h3>isResolved()  <code>&lt;Promise 实例方法&gt;</code></h3>
<p><code>isResolved () =&gt; Boolean</code></p>
<p>返回当前 promise 是否成功了</p>
<h3>isResolved() <code>&lt;static&gt;</code></h3>
<p><code>isResolved () =&gt; Boolean</code></p>
<p>全局静态方法，作用同上</p>
<pre><code>KISSY.Promise.isResolved(promise)</code></pre>
<h3>isRejected()  <code>&lt;Promise 实例方法&gt;</code></h3>
<p><code>isRejected () =&gt; Boolean</code></p>
<p>返回当前 promise 是否失败了</p>
<h3>isRejected() <code>&lt;static&gt;</code></h3>
<p><code>isRejected () =&gt; Boolean</code></p>
<p>全局静态方法，作用同上</p>
<pre><code>KISSY.Promise.isRejected(promise)</code></pre>
<h3>isPromise() <code>&lt;static&gt;</code></h3>
<p><code>isPromise() =&gt; Boolean</code></p>
<p>全局静态方法，判断一个对象是否是Promise实例</p>
<pre><code>KISSY.Promise.isPromise(promise)</code></pre>
<h3>when() <code>&lt;static&gt;</code></h3>
<p><code>when(obj, fulfilled, rejected) =&gt; Promise</code></p>
<p>返回一个新的 promise。如果 obj 为 promise 类型，相当于 <code>obj.then(fulfilled, rejected)</code></p>
<p>否则直接调用 <code>fulfilled(obj)</code>，并返回一个成功的 promise</p>
<h4>parameter</h4>
<p>obj – 监听的对象.</p>
<h3>all() <code>&lt;static&gt;</code></h3>
<p><code>all(objects) =&gt; Promise</code></p>
<p>返回一个新的 promise.当 objects 全部成功后新的 promise 成功，否以第一个 promise 的失败值为失败</p>
<h4>parameter</h4>
<p>objects – promise或普通对象数组</p>


<div id="disqus_thread"></div>
<script>
    if((window.location.hostname.indexOf("kissyui.com")!=-1 )&& window.localStorage.getItem("kissy-commment")!="0"){
    /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
    var disqus_shortname = 'kissy-docs'; // required: replace example with your forum shortname

    // The following are highly recommended additional parameters. Remove the slashes in front to use.
     //var disqus_identifier = '/anim';
     //var disqus_url = window.location;

    /* * * DON'T EDIT BELOW THIS LINE * * */
    (function() {
        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
        dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
    })();
    }
</script>



      
  <style>
	.github-btn {
		border: 0 none;
		overflow: hidden;
		margin-top:4px;
	}
	footer {
		border-top:1px solid #e2e2e2;
		padding-top:20px;
		clear:both;
	}
	/* iPhone 及以下 */
	@media only screen and (max-width: 767px) {
		.github-link {
			display:none;
		}
	}
  </style>
  <footer>




	<div class="text-center">
		©2013 - 2033 KISSY UI LIBRARY
		<br /> <iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=kissyteam&amp;repo=kissy&amp;type=watch&amp;count=true" width="100" height="20" title="Star on GitHub"></iframe> 
	<iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=kissyteam&amp;repo=kissy&amp;type=fork&amp;count=true" width="102" height="20" title="Fork on GitHub"></iframe>
	</div>
  </footer>
    </article>
  </div>
  <a target="_blank" href="https://github.com/kissyteam/kissy" class="github-link"><img alt="Fork me on GitHub" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" style="position: absolute; top: 0; right: 0; border: 0; z-index: 50"></a>
  <script>
	var S = KISSY;
	(function(){
		S.use('node',function(S){
			S.all('code').each(function(node){
				var className = node.attr('class');
				if(/^lang-/.test(className)){
					var tc = className.replace(/^lang-/,'');
					node.replaceClass(className,tc);
				}
			});
			hljs.tabReplace = '    ';
			hljs.initHighlighting();
		});
	})();
	(function(){
		var h3s = document.getElementsByTagName('h3');
		for(var i = 0;i<h3s.length;i++){
			var str = S.trim(h3s[i].innerHTML);
			try{
				str = str.match(/\w+/)[0];
			}catch(e){
				continue;
			}
			h3s[i].innerHTML = '<a name="'+str+'"></a>' + h3s[i].innerHTML;
		}
	})();
  </script>
</body>
</html>
